home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Technology Seed / Mac Tech Seed Feb '97.toast / OpenDoc 1.2b2c1 / Implementation / Messaging / DfltAcs.cpp next >
Encoding:
Text File  |  1997-02-13  |  57.9 KB  |  1,961 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        DfltAcs.cpp
  3.  
  4.     Contains:    Implementation of Mac specific default accessors and handlers.
  5.  
  6.     Owned by:    Jon Pugh
  7.  
  8.     Copyright:    © 1995-96 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <5>      10/15/96    JP        1244606, 1375124 : Improved Container &
  13.                                     added Active Part props.
  14.          <4>     9/23/96    JP        1384958: Removed SEPriv.h include & renamed
  15.                                     GetDefaultRootFrame
  16.          <3>     6/20/96    JP        1300215: Check for null iterators
  17.          <2>      6/4/96    EL        1335851: Release string from GetEditor.
  18.         <57>    25/09/95    NP        1979071: Check results of operator new.
  19.         <56>     9/12/95    JP        1280292 & 1283803: Add Part to Send
  20.         <55>     9/11/95    JP        1269048 & 1283405: Use ODGetComments
  21.         <54>     9/11/95    NP        1272294: Messaging code cleanup.
  22.         <53>     8/25/95    JP        1262410: Comments part to frame fallout
  23.         <52>     8/23/95    NP        1276287: Move constant kODAppShell.
  24.         <51>     8/22/95    eeh        1230007: refbal-inspired cleanup
  25.         <50>     8/16/95    eeh        1276765: mostly formatting
  26.         <49>      8/1/95    eeh        1265319: refcount cleanup
  27.         <48>     7/27/95    DM        #1270320: mem leaks: use Temp Objs in
  28.                                     GetPartFromNULL
  29.         <47>     7/27/95    eeh        1243351: handle pIndex property
  30.         <46>     7/21/95    eeh        1262143: call ODDisposeAppleEvent
  31.         <45>     7/18/95    eeh        1262143: memory leaks; 1267932: SOM call on
  32.                                     disposed object
  33.         <44>      7/5/95    NP        1265196: Wrap CreateEmbeddedFramesIterator
  34.                                     call with exception handling.
  35.         <43>      7/5/95    NP        1265125: Initialize local variable.
  36.         <42>      7/3/95    eeh        1264701: remove WARN; shouldn't be there
  37.                                     anyway
  38.         <41>     6/30/95    JP        Refcounting foo
  39.         <40>     6/29/95    DM        1242642 BB: refcounting: release parent
  40.                                     frame in HandleGetDataInternal()
  41.         <39>     6/28/95    eeh        1262143: dispose AEDescs
  42.         <38>     6/20/95    NP        1260389: Fix DrawPart's count proc
  43.         <37>     6/19/95    eeh        1246443: add PartFrameFromStandardPartToken
  44.                                     etc.
  45.         <36>     6/13/95    JP        Use GetDefaultRootFrameToSwapTo in
  46.                                     GetPartFromNULL
  47.         <35>      6/7/95    eeh        1251403: various refcount changes
  48.         <34>     5/26/95    TJ        Removed contextInfo, and refrences to it.
  49.         <33>     5/26/95    RR        #1251403: Multithreading naming support
  50.         <32>     5/25/95    jpa        Fixed usage of ODDebug. [1253321]
  51.         <31>     5/22/95    eeh        1250831: getdata on part returns objspec
  52.         <30>     5/21/95    NP        1248898: GetUserToken, ODDescToAEDesc, etc.
  53.                                     recipe change.
  54.         <29>     5/18/95    eeh        1250061: make CountEmbeddedFrames
  55.                                     non-static
  56.         <28>     5/17/95    RR        #1250135/1250137/1250143 Getters increment
  57.                                     refcount
  58.         <27>     5/12/95    NP        1237955: Just added a comment here,
  59.                                     actually.
  60.         <26>     5/10/95    JP        1242258: ODSetStationery uses frame instead
  61.                                     of part
  62.         <25>      5/4/95    JP        1238246, 1223529: Change name & icon of
  63.                                     file if root part
  64.         <24>      5/4/95    eeh        1246024: initialize ODFrame* in
  65.                                     HandleSetData
  66.         <23>      5/3/95    NP        1211084: Remove 5$
  67.         <22>     4/29/95    TÇ        1244815 BB: Default Accessors return mod
  68.                                     date when asked for create date
  69.         <21>     4/28/95    eeh        (for eeh) 1243352: implemented GetData for
  70.                                     pContainer
  71.         <20>     4/27/95    TÇ        1223529 BB: ODSetPOName and ODSetIconFamily
  72.                                     should tweak file in root part case (Did
  73.                                     name piece)
  74.         <19>     4/25/95    NP        1186795, 1237220, 1240571: Fixed whose
  75.                                     clauses by allowing swapping in count proc.
  76.         <18>     4/25/95    JP        1192027, 1238519: Added properties and
  77.                                     fixed icon & category
  78.         <17>     4/14/95    TÇ        #1235279 BB: InfoUtil & StdTypIO functions
  79.                                     should take Environment* and SU* when
  80.                                     possible
  81.         <16>     4/14/95    NP        1239651: Include SEPriv.h. Private
  82.                                     constants were moved around.
  83.         <15>      4/7/95    eeh        1236842: added TrySwapToRootPart
  84.         <14>      4/7/95    eeh        1233878: fixed memory leak
  85.         <13>     3/24/95    eeh        1230185: check for null results and errors
  86.         <12>     3/21/95    JP        1192027: Include ODRgstry & change some
  87.                                     constant names
  88.         <11>     3/20/95    NP        1225985: Change API of CreateSwapToken.
  89.         <10>     3/15/95    eeh        1227456: swap when root part should be
  90.                                     equivalent to the document
  91.          <9>     3/13/95    NP        1223764: CreateSwapToken should take an
  92.                                     ODFrame* parameter. Add frame param to
  93.                                     DEFAULT_ACCESSOR_PARAMS.
  94.          <8>      3/2/95    eeh        1214783: finish work on lists
  95.          <7>     2/22/95    eeh        1214783: work on lists; 1222901:
  96.                                     StandardPartToken
  97.          <6>     2/21/95    eeh        1214783: work on lists and on getting by ID
  98.                                     and name
  99.          <5>     2/13/95    eeh        1214783: more work on Get/SetData handlers
  100.          <4>      2/3/95    eeh        1217393: use new ODDesc etc; 1214783:
  101.                                     implement Get/SetData handlers for
  102.                                     part/frame info
  103.          <3>     1/27/95    NP        1213948: Fix object accessors and event
  104.                                     handlers.
  105.          <2>     1/25/95    eeh        1214783: more implementation
  106.          <1>      1/18/95    eeh        first checked in
  107.  
  108.     To Do:
  109.     In Progress:
  110.         
  111. */
  112.  
  113.  
  114. #ifndef _DFLTACS_
  115. #include <DfltAcs.h>
  116. #endif
  117.  
  118. #ifndef _INFOUTIL_
  119. #include <InfoUtil.h>
  120. #endif
  121.  
  122. #ifndef _ODDESUTL_
  123. #include <ODDesUtl.h>
  124. #endif
  125.  
  126. #ifndef _EDITRSET_
  127. #include "EditrSet.h"
  128. #endif
  129.  
  130. #ifndef SOM_ODAppleEvent_xh
  131. #include "ODAplEvt.xh"
  132. #endif
  133.  
  134. #ifndef SOM_ODAddressDesc_xh
  135. #include "ODAdrDes.xh"
  136. #endif
  137.  
  138. #ifndef SOM_ODOSLToken_xh
  139. #include "ODOSLTkn.xh"
  140. #endif
  141.  
  142. #ifndef SOM_ODPart_xh
  143. #include <Part.xh>
  144. #endif
  145.  
  146. #ifndef SOM_ODPartWrapper_xh
  147. #include <PartWrap.xh>
  148. #endif
  149.  
  150. #ifndef __AEPACKOBJECT__
  151. #include <AEPackObject.h>
  152. #endif
  153.  
  154. #ifndef _BNDNSUTL_
  155. #include <BndNSUtl.h>
  156. #endif
  157.  
  158. #ifndef SOM_ODEmbeddedFramesIterator_xh
  159. #include <EmbFrItr.xh>
  160. #endif
  161.  
  162. #ifndef _SIHELPER_
  163. #include <SIHelper.h>
  164. #endif
  165.  
  166. #ifndef _SEUTILS_
  167. #include <SEUtils.h>
  168. #endif
  169.  
  170. #ifndef _BARRAY_
  171. #include "BArray.h"
  172. #endif
  173.  
  174. #ifndef _TEMPOBJ_
  175. #include "TempObj.h"
  176. #endif
  177.  
  178. #ifndef SOM_DefaultAccessorSI_xh
  179. #include <MssgSI.xh>
  180. #endif
  181.  
  182. #ifndef SOM_ODNameResolver_xh
  183. #include <NamRslvr.xh>
  184. #endif
  185.  
  186. #ifndef SOM_ODMessageInterface_xh
  187. #include <MssgIntf.xh>
  188. #endif
  189.  
  190. #ifndef SOM_ODWindowState_xh
  191. #include <WinStat.xh>
  192. #endif
  193.  
  194. #ifndef SOM_Module_OpenDoc_StdDefs_defined
  195. #include <StdDefs.xh>
  196. #endif
  197.  
  198. #ifndef SOM_Module_OpenDoc_Foci_defined
  199. #include "Foci.xh"
  200. #endif
  201.  
  202. #ifndef SOM_ODArbitrator_xh
  203. #include <Arbitrat.xh>
  204. #endif
  205.  
  206. #ifndef __AEOBJECTS__
  207. #include <AEObjects.h>
  208. #endif
  209.  
  210. #ifndef __AEREGISTRY__
  211. #include <AERegistry.h>
  212. #endif
  213.  
  214. #ifndef __OSA__
  215. #include <OSA.h>
  216. #endif
  217.  
  218. #ifndef SOM_Module_OpenDoc_ODRegistry_defined
  219. #include "ODRgstry.xh"
  220. #endif
  221.  
  222. #ifndef __ICONS__
  223. #include <Icons.h>
  224. #endif
  225.  
  226. #pragma segment DefaultAccessors
  227.  
  228. //==============================================================================
  229. // typedefs
  230. //==============================================================================
  231.  
  232. typedef ODError (*InternalHandler)(    Environment *ev,
  233.                                 ODPart* thePart,
  234.                                 ODAppleEvent* message,
  235.                                 ODAppleEvent* reply,
  236.                                 ODSession* session,
  237.                                 AEDesc* directParam,
  238.                                 ODFrame*    frame);
  239.  
  240. //==============================================================================
  241. // Function prototypes
  242. //==============================================================================
  243.  
  244. static void GetDirectParam(ODSession* session, ODAppleEvent* message,
  245.         AEDesc* evtDp);
  246.  
  247. // WE SHOULD AT LEAST HAVE THIS IN A PRIVATE SHARED HEADER.
  248. extern ODFrame* FrameFromContext(OSLContext* context);    // <eeh> ask Nick
  249. static DescType ViewTypetoViewEnum( Environment *ev, ODSession* session,
  250.         ODTypeToken viewType );
  251. static ODTypeToken GetViewTypeFromEnum( Environment *ev, ODSession* session,
  252.         DescType viewEnum );
  253. static ODIText* ITextFromIntlDesc( AEDesc* desc );
  254. static ODError GetEditorFromString(Environment* ev, ODEditor* editor, AEDesc* desc, ODPart* part,
  255.         ODNameSpaceManager* nsm );
  256. static ODIconFamily IfamToIconSuite(AERecord* ifam);
  257. static ODError IconSuiteToIfam( Handle iconSuite, AEDesc* result );
  258. static OSErr CreateObjSpecForFrame( Environment *ev, ODFrame* frame,
  259.         AEDesc* result );
  260. static void AddODOSLTokenToList( ODOSLToken* newToken, ODUShort index,
  261.         AEDesc* list );
  262. static ODOSLToken* DescToODOSLToken( Environment* ev, ODNameResolver* resolver,
  263.         AEDesc* frameDesc, ODOSLToken* tokenToCopy );
  264. //static ODError CreateListInValue( Environment* ev, ODNameResolver* resolver,
  265. //        ODOSLToken* value, AEDesc* list );
  266. extern void NewODToken(ODNameResolver* me, ODOSLToken* openDocToken,
  267.         ODPart* part, OSLToken* newToken);
  268. static ODError HandleEventsForList( Environment *ev,
  269.                                 ODPart* thePart,
  270.                                 ODAppleEvent* message,
  271.                                 ODRecord* reply,
  272.                                 ODSession* session,
  273.                                 AERecord* realToken,
  274.                                 InternalHandler handler );
  275. static ODError HandleGetDataInternal(    Environment *ev, ODPart* thePart,
  276.         ODAppleEvent* message, ODAppleEvent* reply, ODSession* session,
  277.         AEDesc* directParam, ODFrame* frame );
  278. static ODError HandleSetDataInternal(    Environment *ev, ODPart* thePart,
  279.         ODAppleEvent* message, ODAppleEvent* reply, ODSession* session,
  280.         AEDesc* directParam, ODFrame* frame );
  281. static void PutFrameInValue( Environment* ev, ODNameResolver* resolver,
  282.         ODOSLToken* value, ODFrame* frame );
  283. static ODBoolean ITextEqual( ODIText* name1, ODIText* name2 );
  284. static ODFrame* AcquireFrameWithName( Environment* ev, ODFrame* startFrame,
  285.         ODIText* name );
  286. static ODBoolean PartIsContained( Environment* ev, ODFrame* testee,
  287.     ODFrame* container );
  288. static OSErr IndexForFrame( Environment *ev, ODFrame* frame, ODULong* result );
  289. static ODError SwapToRootPart( Environment *ev, ODSession* session,
  290.         ODOSLToken* value);
  291. static ODPersistentObjectID GetIDForFrame( Environment* ev, ODFrame* frame );
  292. // static void CopyNonDPParams( ODAppleEvent* message, ODAppleEvent* newMessage );
  293.  
  294. void ODDuplicateEvent( ODAppleEvent* scrDesc, ODAppleEvent** destDesc );
  295. void ODPutParamDesc( ODAppleEvent* odaevt, DescType keyword, AEDesc* desc );
  296. void ODPutParamDesc( ODAppleEvent* odaevt, DescType keyword, ODDesc* desc );
  297. void ODGetParamDesc( ODAppleEvent* odaevt, DescType keyword, DescType typeSought,
  298.         AEDesc* desc );
  299. void ODGetParamDesc( ODAppleEvent* odaevt, DescType keyword, DescType typeSought,
  300.         ODDesc** desc );
  301. void ODPutAttributeDesc( ODAppleEvent* message, AEKeyword key, ODDesc* desc );
  302. void ODGetAttributePtr( ODAppleEvent *appleEvent, AEKeyword theAEKeyword,
  303.         DescType desiredType, DescType *typeCode, void *dataPtr,
  304.         Size maximumSize, Size *actualSize);
  305.  
  306. #if ODDebug
  307. void PukeIfFrameNULL( ODFrame* frame );
  308. #else
  309. #define PukeIfFrameNULL(frame)
  310. #endif
  311.  
  312. //==============================================================================
  313. // Object Accessor functions
  314. //==============================================================================
  315.  
  316. //------------------------------------------------------------------------------
  317. // GetWildcardFromPart
  318. //------------------------------------------------------------------------------
  319.  
  320. ODError GetWildcardFromPart(DEFAULT_ACCESSOR_PARAMS)
  321. {    
  322.     ODError result;
  323.     TRY
  324.         ODPart* part;
  325.         ODFrame* frame;
  326.         PartFrameFromStandardPartToken( container, &part, &frame );
  327.         ASSERT_FRAME_MATCHES_PART( ev, frame, part );
  328.         session->GetNameResolver(ev)->CreateSwapToken(ev, value, part, frame );
  329.         result = noErr;
  330.     CATCH_ALL
  331.         result = errAENoSuchObject;
  332.     ENDTRY
  333.     return result;
  334. }
  335.  
  336. //------------------------------------------------------------------------------
  337. // TrySwapToRootPart
  338. //------------------------------------------------------------------------------
  339.  
  340. ODError TrySwapToRootPart(DEFAULT_ACCESSOR_PARAMS)
  341. {
  342.     WASSERT( !scriptlessPart );
  343.     return SwapToRootPart( ev, session, value );
  344. }
  345.  
  346. //------------------------------------------------------------------------------
  347. // GetPropFromProp
  348. //------------------------------------------------------------------------------
  349.  
  350. ODError GetPropFromProp(DEFAULT_ACCESSOR_PARAMS)
  351. {
  352.     ODError result = noErr ;
  353.     ODNameResolver* resolver = session->GetNameResolver(ev);
  354.  
  355.     TRY
  356.         if ( (!resolver->IsODToken( ev, value )) || (form != formPropertyID) )
  357.             THROW( errAENoSuchObject );
  358.     
  359.         if ( scriptlessPart == kODAppShell )
  360.             return SwapToRootPart( ev, session, value );
  361.  
  362.         // check for our property from property case
  363.         // if we ever add anything else here, we should probably make a
  364.         // new routine for GetPropFromProp instead of overloading this.
  365.         switch ( FIRSTBYTESFROMHANDLE(container->dataHandle, DescType) )
  366.         {    
  367.             case pActivePart:
  368.             {
  369.                 // Kurt said to just put the knowledge here, so this is all his fault.
  370.                 //
  371.                 // We'll put our swap token into the container and continue
  372.                 ODTypeToken selectionFocus = session->Tokenize(ev, kODSelectionFocus);
  373.                 TempODFrame activeFrame = 
  374.                         session->GetArbitrator(ev)->AcquireFocusOwner(ev, selectionFocus);
  375.                 TempODPart savePart = activeFrame->AcquirePart(ev);
  376.                 session->GetNameResolver(ev)->CreateSwapToken( ev, value, savePart, activeFrame );
  377.                 break;
  378.             }
  379.             case pContainer:
  380.             {
  381.                 ODPart*        part;
  382.                 ODFrame*    frame;
  383.                 resolver->GetContextFromToken(ev, value, &part, &frame);
  384.                 PukeIfFrameNULL( frame );
  385.                 TempODFrame parentFrame = frame->AcquireContainingFrame(ev);
  386.                 TempODPart savePart = parentFrame->AcquirePart(ev);
  387.                 resolver->CreateSwapToken( ev, value, savePart, parentFrame );
  388.                 break;
  389.             }
  390.             default:
  391.                 result = errAENoSuchObject;
  392.         }
  393.     
  394.     CATCH_ALL
  395.         result = ErrorCode();
  396.     ENDTRY
  397.  
  398.     return result;
  399. }
  400.  
  401. //------------------------------------------------------------------------------
  402. // GetPropFromNULL
  403. //------------------------------------------------------------------------------
  404.  
  405. ODError GetPropFromNULL(DEFAULT_ACCESSOR_PARAMS)
  406. {
  407.     ODError result = noErr ;
  408.     ODNameResolver* resolver = session->GetNameResolver(ev);
  409.  
  410.     TRY
  411.         if ( (!resolver->IsODToken( ev, value )) || (form != formPropertyID) )
  412.             THROW( errAENoSuchObject );
  413.     
  414.         if ( scriptlessPart == kODAppShell )
  415.             return SwapToRootPart( ev, session, value );
  416.  
  417.         AEDesc realSelData;
  418.         THROW_IF_ERROR( ODDescToAEDesc(selectionData, &realSelData ));
  419.         TempAEDesc tmpDesc(&realSelData);
  420.     
  421.         switch ( FIRSTBYTESFROMHANDLE(realSelData.dataHandle, DescType) )
  422.         {    
  423.             case pName:
  424.             case pComment:
  425.             case pAuthor:
  426.             case pKind:
  427.             case pEditorName:
  428.             case pBundled:
  429.             case pStationery:
  430.             case pShowLinks:
  431.             case pASCreationDate:
  432.             case pASModificationDate:
  433.             case pSize:
  434.             case pUniqueID:
  435.             case pIcon:
  436.             case pViewType:
  437.             case pContainer:
  438.             case pCategory:
  439.             case pClass:
  440.             case pDefaultType:
  441.             case pBestType:
  442.             case pIndex:
  443.             case pActivePart:
  444.                 break;
  445.             default:
  446.                 result = errAENoSuchObject;
  447.         }
  448.     
  449.         if ( !result )
  450.         {
  451.             ODDesc* userTokenAsODDesc = resolver->GetUserToken(ev, value);
  452.             THROW_IF_ERROR( AEDescToODDesc( &realSelData, userTokenAsODDesc ));
  453.             userTokenAsODDesc->SetDescType(ev, cProperty);
  454.         }
  455.     
  456.     CATCH_ALL
  457.         result = ErrorCode();
  458.     ENDTRY
  459.  
  460. //    AEDisposeDesc( &realSelData );
  461.     return result;
  462. }
  463.  
  464. //------------------------------------------------------------------------------
  465. // GetWildcardFromList
  466. //------------------------------------------------------------------------------
  467.  
  468. ODError GetWildcardFromList(DEFAULT_ACCESSOR_PARAMS)
  469. {
  470.     ODNameResolver* resolver = session->GetNameResolver(ev);
  471.     ODError error = noErr;
  472.  
  473.     AEDesc newList;
  474.     THROW_IF_ERROR( AECreateList( kODNULL, 0, kODFalse, &newList ) );
  475.     TempAEDesc tmpList( &newList );
  476. //    THROW_IF_ERROR( CreateListInValue( ev, resolver, value,
  477. //            &newList ) );
  478.  
  479.     ODSLong count;
  480.     THROW_IF_ERROR( AECountItems( container, &count ) );
  481.     for ( ODUShort index = 1; index <= count; ++index )
  482.     {
  483.         AEDesc        oneContainer;
  484.         DescType    containerDescType;
  485.  
  486.         THROW_IF_ERROR( AEGetNthDesc( container, index, typeWildCard,
  487.                 &containerDescType, &oneContainer ) );
  488.         TempAEDesc tmpDesc( &oneContainer );
  489.  
  490.         ODOSLToken* containerWrapper = new ODOSLToken();
  491.         THROW_IF_NULL(containerWrapper);
  492.         TempODObject tmpObj(containerWrapper);
  493.         containerWrapper->InitODOSLToken(ev);
  494.         THROW_IF_ERROR( AEDescToODDesc( &oneContainer, containerWrapper ) );
  495.         
  496.         if ( !resolver->IsODToken( ev, containerWrapper ) )
  497.         {
  498.             error = errAENoSuchObject;
  499.             break;
  500.         }
  501.  
  502.         ODOSLToken* newValue = value->DuplicateODOSLToken(ev);
  503.         TempODObject tmpObj2(newValue);
  504.         
  505.         resolver->CallObjectAccessor(ev, scriptlessPart, desiredClass,
  506.                 containerWrapper, containerClass, form, selectionData,
  507.                 newValue );
  508.  
  509.         AddODOSLTokenToList( newValue, index, &newList );
  510.  
  511. //        ODDeleteObject(newValue);
  512. //        ODDeleteObject(containerWrapper);
  513.  
  514. //        (void)AEDisposeDesc( &oneContainer );
  515.     }
  516.  
  517.     ODDesc* userODToken = resolver->GetUserToken(ev, value);
  518.     AEDescToODDesc(&newList, userODToken);
  519. //    (void)AEDisposeDesc( &newList );
  520.  
  521.     return error;
  522. }    // GetWildcardFromList()
  523.  
  524. //------------------------------------------------------------------------------
  525. // GetPartFromNULL
  526. //------------------------------------------------------------------------------
  527.  
  528. ODError GetPartFromNULL(DEFAULT_ACCESSOR_PARAMS)
  529. {
  530.     ODUnused(desiredClass);
  531.     ODUnused(container);
  532.     ODUnused(containerClass);
  533.  
  534.     ODNameResolver*        resolver = session->GetNameResolver(ev);
  535.     ODUShort             i;
  536.     ODError                error = noErr;
  537.  
  538.     if( !resolver->IsODToken( ev, value ) )
  539.         return errAENoSuchObject;
  540.     
  541.     AEDesc coercedSelData = NULL_DESCRIPTOR_DEFINITION;
  542.  
  543.     TRY
  544.  
  545.     ODFrame* containingFrame;
  546.     ODPart* ignorePart;
  547.     resolver->GetContextFromToken(ev, value, &ignorePart, &containingFrame);
  548.  
  549. //    PRINT("containingFrame = %ld\n", containingFrame);
  550.     AEDesc realSelData;
  551.     THROW_IF_ERROR( ODDescToAEDesc(selectionData, &realSelData ));
  552.     TempAEDesc tmpSelData(&realSelData);
  553.  
  554.     switch (form)
  555.     {
  556.         case formName:
  557.         {
  558.             TempODFrame resultFrame = kODNULL;
  559.             THROW_IF_ERROR( AECoerceDesc( &realSelData, typeIntlText,
  560.                     &coercedSelData ) );
  561.             TempODIText name = ITextFromIntlDesc( &coercedSelData );
  562.             AEDisposeDesc( &coercedSelData );
  563.  
  564.             if ( !containingFrame )
  565.             {
  566.                 containingFrame =  GetDefaultRootFrame(ev, session);
  567. //                ODWindow* odWindow = session->GetWindowState(ev)->AcquireFrontRootWindow(ev);
  568. //                containingFrame = odWindow->GetRootFrame(ev);
  569. //                ODReleaseObject(ev, odWindow);
  570.                 TempODIText rootName = ODGetPartName(ev, containingFrame,
  571.                         kODNULL);
  572.                 if ( ITextEqual( rootName, name ) )
  573.                     resultFrame = containingFrame ;
  574.             }
  575.             if ( !resultFrame )
  576.                 resultFrame = AcquireFrameWithName( ev, containingFrame, name );
  577.             PutFrameInValue( ev, resolver, value, resultFrame );
  578. //            ODReleaseObject(ev, resultFrame);
  579.             break;
  580.         }
  581.             
  582.         case formUniqueID:
  583.         {
  584.             THROW_IF_ERROR( AECoerceDesc( &realSelData, typeLongInteger,
  585.                     &coercedSelData ) );
  586.             ODPersistentObjectID objectID = FIRSTBYTESFROMHANDLE(
  587.                     coercedSelData.dataHandle, ODPersistentObjectID );
  588.             AEDisposeDesc( &coercedSelData );
  589.  
  590.             ODStorageUnit* su = (containingFrame ? containingFrame : 
  591.                     GetDefaultRootFrame(ev, session))->
  592.                     GetStorageUnit(ev);
  593.             WASSERT(su);
  594.             ODDraft* draft = su->GetDraft(ev);
  595.             ODObjectType objectType;
  596.             TempODFrame thisFrame = (ODFrame*)draft->AcquirePersistentObject(
  597.                     ev, objectID, &objectType);
  598.             TempODObjectType tempObjectType(objectType); // ensure deletion
  599.             
  600.             if ( !thisFrame || (strcmp( kODFrameObject, objectType ) != 0)
  601.                     || (!PartIsContained( ev, thisFrame, containingFrame )) )
  602.                 THROW(errAENoSuchObject);    // $$$$$ This could leak a reference?
  603.             PutFrameInValue( ev, resolver, value, thisFrame );
  604. //            ODReleaseObject(ev, tmpFrame);
  605.         }    break;
  606.  
  607.         case formAbsolutePosition:
  608.         {
  609.             // if the containing part is null, we substitute the root part
  610.             // by doing a swap.  Note that we do this *only* in the case of
  611.             // formAbsolutePosition, because in the others we need to avoid
  612.             // implicit "root part of root part" object specifiers.
  613.             
  614.             if ( scriptlessPart == kODAppShell )
  615.             {
  616.                 error = SwapToRootPart( ev, session, value );
  617.                 break;
  618.             }
  619.  
  620.             // Are we being asked for an indexed part
  621.             // or for all parts?
  622.             ODSLong theIndex;
  623.             ODBoolean allFlag;
  624.             ODBoolean zeroFlag;
  625.  
  626.             ODSLong partCount = CountEmbeddedParts(ev, scriptlessPart);
  627.             error = DecodeOrdinal( realSelData, (long)partCount, 
  628.                             (long*)&theIndex, (Boolean*)&allFlag, (Boolean*)&zeroFlag);
  629.             THROW_IF_ERROR(error);
  630.             
  631.             ODEmbeddedFramesIterator* iter = kODNULL;
  632.             if ( scriptlessPart != kODAppShell ) {
  633.                 iter = scriptlessPart->CreateEmbeddedFramesIterator(ev, kODNULL);
  634.                 if (iter == kODNULL)
  635.                     THROW(kODErrCannotEmbed);
  636.             }
  637.             if ( allFlag )
  638.             {
  639.                 AEDesc listOfTokens;
  640.                 THROW_IF_ERROR( AECreateList( kODNULL, 0, kODFalse,
  641.                         &listOfTokens ) );
  642.                 TempAEDesc tmpDesc( &listOfTokens );
  643. //                error = CreateListInValue( ev, resolver, value, &listOfTokens );
  644. //                THROW_IF_ERROR(error);
  645.  
  646.                 // Get theEmbeddedPart number theIndex
  647.                 for (containingFrame = iter->First(ev), i=1; iter->IsNotComplete(ev);
  648.                         containingFrame = iter->Next(ev), i++)
  649.                 {    
  650.                     if (containingFrame)
  651.                     {
  652.                         AEDesc frameDesc;
  653.                         TempODPart    part = containingFrame->AcquirePart(ev);
  654.                         THROW_IF_ERROR( CreateStandardPartToken(containingFrame,
  655.                                 part, &frameDesc ) );
  656.  
  657.                         ODOSLToken* newValue = DescToODOSLToken(ev,
  658.                                 resolver, &frameDesc, value );
  659.                         (void)AEDisposeDesc(&frameDesc);
  660.                         AddODOSLTokenToList( newValue, i, &listOfTokens );
  661.                         ODDeleteObject( newValue );
  662.                     }
  663.                 }
  664.  
  665.                 ODDesc*    userTokenODDesc = resolver->GetUserToken( ev, value );
  666.                 THROW_IF_ERROR(AEDescToODDesc(&listOfTokens, userTokenODDesc));
  667.  
  668. //                AEDisposeDesc(&listOfTokens);
  669.             }
  670.             else
  671.             {
  672.                 // Get theEmbeddedPart number theIndex
  673.                 for (containingFrame = iter->First(ev), i=1; iter->IsNotComplete(ev);
  674.                         containingFrame = iter->Next(ev), i++)
  675.                 {    
  676.                     if (i == theIndex)
  677.                         break;
  678.                 }
  679.                 
  680.                 PutFrameInValue( ev, resolver, value, containingFrame );
  681.             }
  682.             ODDeleteObject(iter);
  683.             break;
  684.         }
  685.         default:
  686.             THROW(errAENoSuchObject);
  687.             break;
  688.     }
  689.         
  690.     
  691.     CATCH_ALL
  692.     error = ErrorCode();
  693.     ENDTRY
  694.     
  695. //    (void)AEDisposeDesc( &realSelData );
  696.     return error;
  697. }
  698.  
  699. //==============================================================================
  700. // Event Handler functions
  701. //==============================================================================
  702.  
  703. //------------------------------------------------------------------------------
  704. // HandleGetData
  705. //------------------------------------------------------------------------------
  706.  
  707. ODError HandleGetData(    Environment *ev,
  708.                         ODPart* thePart,
  709.                         ODAppleEvent* message,
  710.                         ODAppleEvent* reply,
  711.                         ODSession* session)
  712. {
  713.     ODError            error = noErr;
  714.     ODNameResolver*    resolver = session->GetNameResolver(ev);
  715.  
  716.     OSLToken evtDp;
  717.     GetDirectParam( session, message, &evtDp );
  718.     TempAEDesc tmpDesc(&evtDp);
  719.  
  720.     ODOSLToken* tmpWrapper = new ODOSLToken();
  721.     THROW_IF_NULL(tmpWrapper);
  722.     TempODObject tmpObj(tmpWrapper);
  723.     tmpWrapper->InitODOSLToken(ev);
  724.     THROW_IF_ERROR( AEDescToODDesc(&evtDp, tmpWrapper ) );
  725.  
  726.     ODPart* ignorePart;
  727.     ODFrame* frame;
  728.     resolver->GetContextFromToken(ev, tmpWrapper, &ignorePart, &frame);
  729.  
  730.     ODDesc* myToken;
  731.     myToken = resolver->GetUserToken(ev, tmpWrapper);
  732.     AEDesc realToken;
  733.     THROW_IF_ERROR( ODDescToAEDesc(myToken, &realToken) );
  734.  
  735.     error = HandleGetDataInternal( ev, thePart, message, reply,
  736.             session, &realToken, frame );
  737.  
  738.     AEDisposeDesc(&realToken);
  739. //    AEDisposeDesc(&evtDp);
  740.  
  741. //    ODDeleteObject(tmpWrapper);
  742.     return error;
  743. }
  744.  
  745. //------------------------------------------------------------------------------
  746. // PukeIfFrameNULL
  747. //------------------------------------------------------------------------------
  748.  
  749. #if ODDebug
  750. void PukeIfFrameNULL( ODFrame* frame )
  751. {
  752.     if ( !frame )
  753.     {
  754.         WARN( "frame is null; throwing errAEEventNotHandled." );
  755.         THROW( errAEEventNotHandled );
  756.     }
  757. }
  758. #endif
  759.  
  760. ODError HandleGetDataInternal(    Environment *ev,
  761.                                 ODPart* thePart,
  762.                                 ODAppleEvent* message,
  763.                                 ODAppleEvent* reply,
  764.                                 ODSession* session,
  765.                                 AEDesc* directParam,
  766.                                 ODFrame*    frame)
  767. {
  768.     ODError err = noErr;
  769.  
  770.     if ( directParam->descriptorType == typeAEList )
  771.     {
  772.         err = HandleEventsForList( ev, thePart, message, reply,
  773.                 session, directParam, HandleGetDataInternal );
  774.     }
  775.     else
  776.     {
  777.         if ( !thePart )
  778.             return errAEEventNotHandled;
  779.  
  780.         AEDesc result = NULL_DESCRIPTOR_DEFINITION;
  781.  
  782.         // find out what type was requested
  783.         // e.g. get foo as alias
  784.         DescType    desiredType, theType;
  785.         long        theSize;
  786.         AppleEvent    theMessage;
  787.         THROW_IF_ERROR( ODDescToAEDesc(message, &theMessage) );
  788.         err = AEGetParamPtr( &theMessage, keyAERequestedType, typeType,
  789.                 &theType, &desiredType, sizeof(desiredType), &theSize );
  790.         ODDisposeAppleEvent(&theMessage);
  791.         if ( err != noErr ) {
  792.             desiredType = typeWildCard;
  793.             err = noErr;
  794.         }
  795.  
  796.         switch( directParam->descriptorType )
  797.         {
  798.             case cPart:
  799.                 err = CreateObjSpecForFrame( ev,
  800.                         FrameFromStandardPartToken(directParam), &result );
  801.                 break;
  802.  
  803.             case cProperty:
  804.             {
  805.                 ODBoolean boolResult;
  806.                 ODIText* itext = kODNULL;
  807.         
  808.                 ODStorageUnit* partSU = ODGetSUFromPstObj(ev, thePart);
  809.                 
  810.                 DescType property = FIRSTBYTESFROMHANDLE( directParam->dataHandle,
  811.                         DescType );
  812.                 
  813.                 switch( property )
  814.                 {
  815.                     // text properties
  816.                     case pName:
  817.                     case pComment:
  818.                     case pAuthor:
  819.                     case pKind:
  820.                     case pEditorName:
  821.                     case pCategory:
  822.                     {
  823.                         ODBoolean okToDispose = kODTrue;
  824.                         if ( property == pName )
  825.                             itext = ODGetPartName(ev, frame, kODNULL );
  826.                         else if ( property == pComment )
  827.                         {
  828.                             itext = ODGetComments(ev, frame, kODNULL );
  829.                             if ( !itext )
  830.                             {
  831.                                 // script and language code don't matter here; stripped below
  832.                                 itext = CreateITextCString( 0, 0, "" );
  833.                                 okToDispose = kODTrue;
  834.                             }
  835.                         }
  836.                         else if ( property == pCategory )
  837.                             itext = ODGetCategory(ev, thePart, session->GetNameSpaceManager(ev) );
  838.                         else if ( property == pAuthor )
  839.                             itext = ODGetModifiedBy(ev, partSU, kODNULL );
  840.                         else if ( property == pKind )
  841.                         {
  842.                             ODType theType = ODGetKind(ev, thePart );
  843.                             okToDispose = !GetUserKindFromKind(
  844.                                     session->GetNameSpaceManager(ev), theType, &itext );
  845.                         }
  846.                         else if ( property == pEditorName )
  847.                         {
  848.                             TempODEditor editor = ((ODPartWrapper*)thePart)->GetEditor(ev);
  849.                             okToDispose = !GetUserEditorFromEditor(
  850.                                     session->GetNameSpaceManager(ev), editor, &itext );
  851.                         }
  852.             
  853.                         if ( itext )
  854.                         {
  855.                             err = AECreateDesc( typeChar, GetITextPtr( itext ),
  856.                                     GetITextStringLength( itext ), &result );
  857.                             if ( okToDispose )
  858.                                 DisposeIText(itext);
  859.                         }
  860.                         else
  861.                             err = errAEEventNotHandled;
  862.                         break;
  863.                     }
  864.                     
  865.                     // type properties
  866.                     case pClass:
  867.                     case pDefaultType:
  868.                     case pBestType:
  869.                     {
  870.                         DescType theType = cObjectSpecifier;
  871.                         if (property == pClass)
  872.                             theType = cPart;
  873.                         err = AECreateDesc(typeType, &theType, sizeof(theType), &result);
  874.                         break;
  875.                     }
  876.                     
  877.                     // boolean properties
  878.                     case pBundled:
  879.                     case pStationery:
  880.                     case pShowLinks:
  881.                     {
  882.                         if ( property == pBundled )
  883.                         {
  884.                             PukeIfFrameNULL( frame );
  885.                             ASSERT_FRAME_MATCHES_PART( ev, frame, thePart );
  886.                             boolResult = frame->IsFrozen(ev);
  887.                         }
  888.                         else if ( property == pStationery )
  889.                             boolResult = ODGetIsStationery(ev, frame);
  890.                         else // if ( property == pShowLinks )
  891.                         {
  892.                             PukeIfFrameNULL( frame );
  893.                             TempODWindow window = frame->AcquireWindow(ev);
  894.                             boolResult = window->ShouldShowLinks(ev);
  895. //                            ODReleaseObject( ev, window );
  896.                         }
  897.                         
  898.                         err = AECreateDesc(typeBoolean, &boolResult, sizeof(boolResult),
  899.                                 &result );
  900.                         break;
  901.                     }
  902.                     
  903.                     // date properties
  904.                     case pASCreationDate:
  905.                     case pASModificationDate:
  906.                     {
  907.                         long theDate[2];
  908.                         
  909.                         theDate[0] = 0;
  910.                         if ( property == pASCreationDate )
  911.                             theDate[1] = ODGetCreationDate(ev, partSU);
  912.                         else // if ( property == pASModificationDate )
  913.                             theDate[1] = ODGetModificationDate(ev, partSU);
  914.                         err = AECreateDesc(typeLongDateTime, &theDate, sizeof(theDate), &result);
  915.                         break;
  916.                     }
  917.                     
  918.                     case pActivePart:
  919.                     {
  920.                         ODTypeToken selectionFocus = session->Tokenize(ev, kODSelectionFocus);
  921.                         TempODFrame activeFrame = session->GetArbitrator(ev)->AcquireFocusOwner(ev, selectionFocus);
  922.                         if (activeFrame)
  923.                             err = CreateObjSpecForFrame(ev, activeFrame, &result);
  924.                         break;
  925.                     }
  926.                     
  927.                     case pSize:
  928.                     {
  929.                         ODULong longResult = ODGetPOSize(ev, thePart );
  930.                         err = AECreateDesc(typeLongInteger, &longResult,
  931.                                 sizeof(longResult), &result );
  932.                         break;
  933.                     }
  934.                     
  935.                     case pUniqueID:
  936.                     {
  937.                         PukeIfFrameNULL( frame );
  938.                         ODPersistentObjectID id = GetIDForFrame( ev, frame );
  939.                         err = AECreateDesc(typeLongInteger, &id,
  940.                                 sizeof(id), &result );
  941.                         break;
  942.                     }
  943.                     
  944.                     case pIndex:
  945.                         PukeIfFrameNULL( frame );
  946.                         ODULong index;
  947.                         err = IndexForFrame( ev, frame, &index );
  948.                         if ( err == noErr )
  949.                             err = AECreateDesc( typeLongInteger, &index,
  950.                                     sizeof(index), &result );
  951.                         break;
  952.  
  953.                     case pIcon:
  954.                     {
  955.                         ODIconFamily iconFamily = ODGetIconFamily(ev, frame );
  956.                         err = IconSuiteToIfam( iconFamily, &result );
  957.                         break;
  958.                     }
  959.             
  960.                     case pViewType:
  961.                     {
  962.                         PukeIfFrameNULL( frame );
  963.                         DescType type = ViewTypetoViewEnum( ev, session,
  964.                                 frame->GetViewType(ev) ) ;
  965.                         err = AECreateDesc(typeEnumeration, &type,
  966.                                 sizeof(type), &result );
  967.                         break;
  968.                     }
  969.         
  970.                     case pContainer:
  971.                     {
  972.                         PukeIfFrameNULL( frame );
  973.                         { TempODFrame parentFrame = frame->AcquireContainingFrame(ev); // DMc refcount - make temp
  974.                           // DMc - I carefully checked that CreateObjSpecForFrame() does not consume this ref.
  975.                           err = parentFrame ?
  976.                                 CreateObjSpecForFrame(ev, parentFrame, &result)
  977.                                 : errAENoSuchObject;
  978.                         }
  979.                         break;
  980.                     }
  981.                     default:
  982.                         err = errAEEventNotHandled;
  983.                 }
  984.                 break;    // case cProperty:
  985.             }
  986.             default:
  987.                 err = errAEEventNotHandled;
  988.         }
  989.         
  990.         if ( !err )
  991.         {
  992.             if (desiredType != typeWildCard && desiredType != result.descriptorType)
  993.             {
  994.                 AEDesc    newDesc;
  995.                 err = AECoerceDesc(&result, desiredType, &newDesc);
  996.                 if (err != noErr)
  997.                 {
  998.                     // we can't coerce to the desiredType, so we provide a decent
  999.                     // error message and throw the error
  1000.                     AppleEvent    replyAsAEDesc;
  1001.                     THROW_IF_ERROR( ODDescToAEDesc(reply, &replyAsAEDesc) );
  1002.                     THROW_IF_ERROR( AEPutParamPtr(&replyAsAEDesc, kOSAErrorExpectedType, typeType,
  1003.                                 &desiredType, sizeof(desiredType)) );
  1004.                     THROW_IF_ERROR( AEDescToODDesc(&replyAsAEDesc, reply) );
  1005.                     ODDisposeAppleEvent(&replyAsAEDesc);
  1006.                     THROW(err);
  1007.                 }
  1008.                 
  1009.             }    
  1010.         }
  1011.  
  1012.         if ( !err )
  1013.         {
  1014.             ODPutParamDesc( reply, keyDirectObject, &result );
  1015.             AEDisposeDesc( &result );
  1016.         }
  1017.  
  1018.     }
  1019.     return err;
  1020. }    // HandleGetDataInternal
  1021.  
  1022. //------------------------------------------------------------------------------
  1023. // HandleEventsForList
  1024. //------------------------------------------------------------------------------
  1025.  
  1026. static ODError HandleEventsForList( Environment *ev,
  1027.                                 ODPart* thePart,
  1028.                                 ODAppleEvent* message,
  1029.                                 ODRecord* reply,
  1030.                                 ODSession* session,
  1031.                                 AERecord* realToken,
  1032.                                 InternalHandler handler )
  1033. {
  1034.     ODError err = noErr;
  1035.     AERecord fakeReply;
  1036.     AERecord listOTokens;
  1037.     
  1038.     TRY
  1039.         if ( reply )
  1040.         {
  1041.             THROW_IF_ERROR( AECreateList( kODNULL, 0, kODTrue, &fakeReply ) );
  1042.             THROW_IF_ERROR( AECreateList( kODNULL, 0, kODFalse, &listOTokens ));
  1043.         }
  1044.  
  1045.         ODSLong count;
  1046.         THROW_IF_ERROR( AECountItems( realToken, &count ) );
  1047.  
  1048.         for ( ODUShort index = 1; index <= count ; ++index )
  1049.         {
  1050.             AEDesc        oneToken;
  1051.             DescType    tokenDescType;
  1052.             THROW_IF_ERROR( AEGetNthDesc( realToken, index, typeWildCard,
  1053.                     &tokenDescType, &oneToken ) );
  1054.             TempAEDesc tmpDesc( &oneToken );
  1055.     
  1056.             ODMessageInterface* msgIntf = session->GetMessageInterface(ev);
  1057.  
  1058.             AEEventClass eventClass = (AEEventClass)GetSLongAttrOD(
  1059.                     message, keyEventClassAttr);
  1060.             AEEventID eventID = (AEEventID)GetSLongAttrOD(
  1061.                     message, keyEventIDAttr);
  1062.  
  1063.             ODAddressDesc* addressDesc;
  1064.             msgIntf->CreatePartAddrDesc( ev, &addressDesc, thePart );// <eeh> not the right part <jp> why?  is it now?
  1065.             TempODObject tmpObj(addressDesc);
  1066.  
  1067.             ODAppleEvent* newMessage;
  1068.             ODDuplicateEvent( message, &newMessage );
  1069.             TempODObject tmpODAEVT(newMessage);
  1070.             ODPutAttributeDesc( newMessage, keyAddressAttr, addressDesc );
  1071.  
  1072.             ODPutParamDesc( newMessage, keyDirectObject, &oneToken );
  1073.  
  1074.             ODAppleEvent* odreply = new ODAppleEvent();
  1075.             THROW_IF_NULL(odreply);
  1076.             TempODObject tmpObj2(odreply);
  1077.             odreply->InitODAppleEvent(ev);
  1078.             
  1079.             msgIntf->Send( ev, kODNULL, thePart, newMessage, odreply,
  1080.                     kAEWaitReply | kAECanInteract | kAEDontRecord,
  1081.                     kAENormalPriority,
  1082.                     kAEDefaultTimeout );
  1083.  
  1084.             if ( reply )
  1085.             {
  1086.                 AEDesc oneReplyToken;
  1087.                 ODGetParamDesc( odreply, keyDirectObject, typeWildCard,
  1088.                         &oneReplyToken );
  1089.                 THROW_IF_ERROR(AEPutDesc( &listOTokens, index, &oneReplyToken));
  1090.                 AEDisposeDesc( &oneReplyToken );
  1091.             }
  1092. //            ODDeleteObject( odreply );
  1093. //            ODDeleteObject( addressDesc );
  1094. //            ODDeleteObject( newMessage );
  1095. //            AEDisposeDesc( &oneToken );
  1096.         }
  1097.  
  1098.     CATCH_ALL
  1099.         err = ErrorCode();
  1100.     ENDTRY
  1101.         if ( reply )
  1102.         {
  1103.             if ( !err )
  1104.                 ODPutParamDesc( (ODAppleEvent*)reply, keyDirectObject,
  1105.                         &listOTokens );
  1106.             (void)AEDisposeDesc( &listOTokens );
  1107.             (void)AEDisposeDesc( &fakeReply );
  1108.         }
  1109.  
  1110.     return err;
  1111. }
  1112.  
  1113. //------------------------------------------------------------------------------
  1114. // HandleSetData
  1115. //------------------------------------------------------------------------------
  1116.  
  1117. ODError HandleSetData(    Environment *ev,
  1118.                         ODPart* thePart,
  1119.                         ODAppleEvent* message,
  1120.                         ODAppleEvent* reply,
  1121.                         ODSession* session)
  1122. {
  1123.     ODError error = noErr;
  1124.     ODNameResolver* resolver = session->GetNameResolver(ev);
  1125.  
  1126.     AEDesc evtDp;
  1127.     GetDirectParam( session, message, &evtDp );
  1128.  
  1129.     ODOSLToken* tmpWrapper = new ODOSLToken();
  1130.     THROW_IF_NULL(tmpWrapper);
  1131.     TempODObject tmpObj(tmpWrapper);
  1132.     tmpWrapper->InitODOSLToken(ev);
  1133.     THROW_IF_ERROR( AEDescToODDesc(&evtDp, tmpWrapper ) );
  1134.     (void)AEDisposeDesc( &evtDp );
  1135.  
  1136.     if( resolver->IsODToken(ev, tmpWrapper) )
  1137.     {
  1138.         ODDesc* myToken = resolver->GetUserToken(ev, tmpWrapper);
  1139.         AEDesc realToken;
  1140.         THROW_IF_ERROR( ODDescToAEDesc(myToken, &realToken ) );
  1141.         TempAEDesc tmpDesc(&realToken);
  1142.         
  1143.         ODPart* ignorePart;
  1144.         ODFrame* frame;
  1145.         resolver->GetContextFromToken(ev, tmpWrapper, &ignorePart, &frame);
  1146.     
  1147.         error = HandleSetDataInternal( ev, thePart, message, reply,
  1148.                 session, &realToken, frame );
  1149.     
  1150. //        (void)AEDisposeDesc( &realToken );
  1151.     }
  1152.     else
  1153.         error = errAENoSuchObject;
  1154.  
  1155. //    ODDeleteObject(tmpWrapper);
  1156.  
  1157.     return error;
  1158. }
  1159.  
  1160.  
  1161. //------------------------------------------------------------------------------
  1162. // HandleSetDataInternal
  1163. //------------------------------------------------------------------------------
  1164.  
  1165. ODError HandleSetDataInternal( Environment *ev, ODPart* thePart,
  1166.         ODAppleEvent* message, ODAppleEvent* /*reply*/, ODSession* session,
  1167.         AEDesc* directParam, ODFrame* frame )
  1168. {    
  1169.     ODError error = noErr;
  1170.  
  1171.     if ( directParam->descriptorType == typeAEList )
  1172.     {
  1173.         // SetData for lists provided for testing only!  Will be removed before ship
  1174. #if ODDebug
  1175.         error = HandleEventsForList( ev, thePart, message, kODNULL,    // null for reply
  1176.                 session, directParam, HandleSetDataInternal );
  1177. #else
  1178.         // we don't do destructive things on lists.  There's no way to ensure
  1179.         // that all will succeed before beginning, and managing fewer than
  1180.         // all of them is not acceptable.
  1181.         return errAEEventNotHandled;
  1182. #endif
  1183.     }
  1184.     else
  1185.     {
  1186.         if ( directParam->descriptorType != cProperty )
  1187.             return errAENoSuchObject;
  1188.         
  1189. //        ODFrame* frame = session->GetNameResolver(ev)->AcquireContainingFrame(ev);
  1190.     
  1191.         DescType property = FIRSTBYTESFROMHANDLE( directParam->dataHandle,
  1192.                 DescType );
  1193.     
  1194.         AEDesc dataDesc;
  1195.         ODGetParamDesc( message, keyAEData, typeWildCard, &dataDesc );
  1196.         if ( !error )
  1197.         {
  1198.             AEDesc coercedDataDesc;
  1199.             coercedDataDesc.dataHandle = kODNULL;
  1200.             switch( property )
  1201.             {
  1202.                 // read only properties: this is an error
  1203.                 case pAuthor:
  1204.                 case pSize:
  1205.                 case pASCreationDate:
  1206.                 case pASModificationDate:
  1207.                 case pCategory:
  1208.                 case pKind:
  1209.                 case pUniqueID:
  1210.                 case pContainer:
  1211.                 case pIndex:
  1212.                     // <eeh> is there an error for setting r/o properties?
  1213.                     error = errAEEventNotHandled;
  1214.                     break;
  1215.     
  1216.                 case pName:
  1217.                 case pComment:
  1218.                     error = AECoerceDesc( &dataDesc, typeIntlText, &coercedDataDesc );
  1219.                     if ( !error )
  1220.                     {
  1221.                         ODIText* name = ITextFromIntlDesc(&coercedDataDesc);
  1222.                         if ( property == pName )
  1223.                         {
  1224.                             if (!ODSetPartName(ev, frame, name, kAENo))
  1225.                                 error = errAEEventNotHandled;
  1226.                         }
  1227.                         else // if ( property == pComment )
  1228.                             ODSetComments(ev, frame, name );
  1229.     
  1230.                         DisposeIText(name);
  1231.                     }
  1232.                     break;
  1233.                 
  1234.                 case pBundled:
  1235.                 case pStationery:
  1236.                 case pShowLinks:
  1237.                     error = AECoerceDesc( &dataDesc, typeBoolean, &coercedDataDesc );
  1238.                     if ( !error )
  1239.                     {
  1240.                         ODBoolean bool = FIRSTBYTESFROMHANDLE(
  1241.                                 coercedDataDesc.dataHandle,    ODBoolean );
  1242.                         if ( property == pBundled )
  1243.                         {
  1244.                             WASSERT( frame );
  1245.                             ASSERT_FRAME_MATCHES_PART( ev, frame, thePart );
  1246.                             frame->SetFrozen( ev, bool );
  1247.                         }
  1248.                         else if ( property == pStationery )
  1249.                             ODSetIsStationery(ev, frame, bool );
  1250.                         else if ( property == pShowLinks )
  1251.                         {
  1252.                             PukeIfFrameNULL( frame );
  1253.                             SetAllWindowShowLinks(ev, session->GetWindowState(ev), bool);
  1254. //                            TempODWindow window = frame->AcquireWindow(ev);
  1255. //                            window->SetShouldShowLinks(ev, bool );
  1256. //                            ODReleaseObject( ev, window );
  1257.                         }
  1258.                     }
  1259.                     break;
  1260.         
  1261.                 case pIcon:
  1262.                     error = AECoerceDesc( &dataDesc, typeAERecord, &coercedDataDesc );
  1263.                     if ( !error )
  1264.                     {
  1265.                         ODIconFamily iconFamily = IfamToIconSuite(&coercedDataDesc);
  1266.                         ODSetIconFamily(ev, frame, iconFamily );
  1267.                         (void) DisposeIconSuite( iconFamily, kODTrue );
  1268.                     }
  1269.                     break;
  1270.     
  1271.                 case pViewType:
  1272.                     error = AECoerceDesc( &dataDesc, typeEnumeration,
  1273.                             &coercedDataDesc );
  1274.                     if ( !error )
  1275.                     {
  1276.                         DescType viewEnum = FIRSTBYTESFROMHANDLE(
  1277.                                 coercedDataDesc.dataHandle,    ODTypeToken );
  1278.                         ODTypeToken viewType = GetViewTypeFromEnum( ev, session,
  1279.                                 viewEnum );
  1280.                         PukeIfFrameNULL( frame );
  1281.                         frame->SetViewType( ev, viewType );
  1282.                     }
  1283.                     break;
  1284.     
  1285.                 case pEditorName:
  1286.                     error = AECoerceDesc(&dataDesc, typeIntlText, &coercedDataDesc);
  1287.                     if ( !error )
  1288.                     {
  1289.                         ODEditor editor;
  1290.                         error = GetEditorFromString(ev, &editor, &coercedDataDesc,
  1291.                                 thePart, session->GetNameSpaceManager(ev) );
  1292.                         TempODEditor tempEditor = ((ODPartWrapper*)thePart)->GetEditor(ev);
  1293.                         if ( (!error) &&
  1294.                             // don't try to set the same editor again....
  1295.                             strcmp(editor,tempEditor))
  1296.                         {
  1297.                             // <eeh> note that other code calling UseEditor
  1298.                             // mucks with the storage unit, perhaps to make
  1299.                             // the change stick?  Check this out.
  1300.                                ((ODPartWrapper*)thePart)->UseEditor( ev, editor );
  1301.                            }
  1302.                     }
  1303.                     break;
  1304.     
  1305.                 default:
  1306.                     error = errAEEventNotHandled;
  1307.             }
  1308.             AEDisposeDesc( &coercedDataDesc );
  1309.             AEDisposeDesc( &dataDesc );
  1310.         }
  1311.     }
  1312.  
  1313.     return error;
  1314. }    // HandleSetData()
  1315.  
  1316. /*******************************************************************************
  1317. //
  1318. // Utility functions
  1319. //
  1320. *******************************************************************************/
  1321.  
  1322. //------------------------------------------------------------------------------
  1323. // PutOneIcon
  1324. //------------------------------------------------------------------------------
  1325.  
  1326. static void PutOneIcon( Handle iconSuite, AERecord* ifam, DescType type )
  1327. {
  1328.     Handle iconData;
  1329.     OSErr err = GetIconFromSuite( &iconData, iconSuite, type);
  1330.     if ( err == noErr )
  1331.     {
  1332.         AEDesc oneIcon;
  1333.         oneIcon.descriptorType = type;
  1334.         oneIcon.dataHandle = iconData;
  1335.         err = AEPutKeyDesc( ifam, type, &oneIcon );
  1336.     }
  1337. }
  1338.  
  1339. //------------------------------------------------------------------------------
  1340. // IconSuiteToIfam
  1341. //------------------------------------------------------------------------------
  1342.  
  1343. static ODError IconSuiteToIfam( Handle iconSuite, AEDesc* result )
  1344. {
  1345.     if ( !iconSuite )
  1346.         return errAEEventFailed;    // need a better error?
  1347.     AERecord record;
  1348.     ODError err = AECreateList( kODNULL, 0, kODTrue, &record );
  1349.     if ( err ) return err ;
  1350.  
  1351.     PutOneIcon( iconSuite, &record, large1BitMask );        // 'ICN#',
  1352.     PutOneIcon( iconSuite, &record, large4BitData );        // 'icl4',
  1353.     PutOneIcon( iconSuite, &record, large8BitData );        // 'icl8',
  1354.     PutOneIcon( iconSuite, &record, small1BitMask );        // 'ics#',
  1355.     PutOneIcon( iconSuite, &record, small4BitData );        // 'ics4',
  1356.     PutOneIcon( iconSuite, &record, small8BitData );        // 'ics8',
  1357.     PutOneIcon( iconSuite, &record, mini1BitMask );            // 'icm#',
  1358.     PutOneIcon( iconSuite, &record, mini4BitData );            // 'icm4',
  1359.     PutOneIcon( iconSuite, &record, mini8BitData );            // 'icm8'
  1360.     
  1361.     err = AECoerceDesc( &record, 'ifam', result );
  1362.     AEDisposeDesc( &record );
  1363.     return err;
  1364. }
  1365.  
  1366. //------------------------------------------------------------------------------
  1367. // GetOneIcon
  1368. //------------------------------------------------------------------------------
  1369.  
  1370. static void GetOneIcon( Handle iconSuite, AERecord* ifam, DescType type )
  1371. {
  1372.     AEDesc oneIcon;
  1373.     ODError err = AEGetKeyDesc( ifam, type, type, &oneIcon );
  1374.     if ( !err )
  1375.     {
  1376.         if ( AddIconToSuite( oneIcon.dataHandle, iconSuite, type) != noErr )
  1377.             // no point in holding onto the handle
  1378.             AEDisposeDesc( &oneIcon );
  1379.     }
  1380. }
  1381.  
  1382. //------------------------------------------------------------------------------
  1383. // IfamToIconSuite
  1384. //------------------------------------------------------------------------------
  1385.  
  1386. static ODIconFamily IfamToIconSuite(AERecord* ifam)
  1387. {
  1388.     Handle iconSuite;
  1389.     OSErr err = NewIconSuite( &iconSuite );
  1390.     if ( err ) return kODNULL;
  1391.  
  1392.     GetOneIcon( iconSuite, ifam, large1BitMask );        // 'ICN#',
  1393.     GetOneIcon( iconSuite, ifam, large4BitData );        // 'icl4',
  1394.     GetOneIcon( iconSuite, ifam, large8BitData );        // 'icl8',
  1395.     GetOneIcon( iconSuite, ifam, small1BitMask );        // 'ics#',
  1396.     GetOneIcon( iconSuite, ifam, small4BitData );        // 'ics4',
  1397.     GetOneIcon( iconSuite, ifam, small8BitData );        // 'ics8',
  1398.     GetOneIcon( iconSuite, ifam, mini1BitMask );        // 'icm#',
  1399.     GetOneIcon( iconSuite, ifam, mini4BitData );        // 'icm4',
  1400.     GetOneIcon( iconSuite, ifam, mini8BitData );        // 'icm8'
  1401.  
  1402.     return iconSuite;
  1403. }
  1404.  
  1405. //------------------------------------------------------------------------------
  1406. // GetEditorFromString
  1407. //------------------------------------------------------------------------------
  1408.  
  1409. static ODError GetEditorFromString(Environment* ev, ODEditor* editor, AEDesc* desc, ODPart* part,
  1410.         ODNameSpaceManager* nsm )
  1411. {
  1412.     ODError error = errAEEventNotHandled;
  1413.     TempODIText newEditor = ITextFromIntlDesc( desc );
  1414.     if ( !newEditor ) return errAEEventNotHandled;
  1415.  
  1416.     EditorSet* editorSet = new EditorSet();
  1417.     editorSet->InitEditorSet();
  1418.     ODBoolean someFound = GetAllEditorsForKind( nsm, ODGetKind(ev, part ),
  1419.             editorSet );
  1420.  
  1421.     if ( someFound )
  1422.     {
  1423.         EditorSetIterator* editorIter = editorSet->CreateIterator();
  1424.         for (ODEditor candidate = editorIter->First();
  1425.             editorIter->IsNotComplete();
  1426.             candidate = editorIter->Next())
  1427.         {
  1428.             ODName* name;
  1429.             if ( GetUserEditorFromEditor( nsm, candidate, &name ) )
  1430.             {
  1431.                 if ( (GetITextStringLength(name) == GetITextStringLength(newEditor))
  1432.                     && (GetITextLangCode(name) == GetITextLangCode(newEditor))
  1433.                     && (GetITextScriptCode(name) == GetITextScriptCode(newEditor))
  1434.                     && strncmp(GetITextPtr(name),
  1435.                             GetITextPtr(newEditor), GetITextStringLength(name)) == 0 )
  1436.                 {
  1437.                     *editor = candidate;
  1438.                     error = noErr;
  1439.                     break;
  1440.                 }
  1441.             }
  1442.         }
  1443.         delete editorIter;
  1444.     }
  1445.     ODDeleteObject( editorSet );
  1446. //    DisposeIText(newEditor);
  1447.     return error;
  1448. }
  1449.  
  1450. //------------------------------------------------------------------------------
  1451. // ITextFromIntlDesc
  1452. //------------------------------------------------------------------------------
  1453.  
  1454. static ODIText* ITextFromIntlDesc( AEDesc* desc )
  1455. {
  1456.     WASSERT( desc->descriptorType == typeIntlText );
  1457.  
  1458.     ODSLong len = GetHandleSize( desc->dataHandle );
  1459.     ODLockHandle( desc->dataHandle );
  1460.     IntlText* ASItext = (IntlText*)*desc->dataHandle;
  1461.     // save as we're about to overwrite with stringlength byte
  1462.     ScriptCode scriptCode = ASItext->theScriptCode;
  1463.     LangCode langCode = ASItext->theLangCode;
  1464.     char* str = ((char*)&ASItext->theText) - 1 ;
  1465.     len -= sizeof(ASItext->theScriptCode)
  1466.                 + sizeof(ASItext->theScriptCode);
  1467.     str[0] = len;
  1468.     ODIText* name = CreateIText( scriptCode, langCode,
  1469.             (StringPtr)str );
  1470.     ODUnlockHandle( desc->dataHandle );
  1471.     return name;
  1472. }
  1473.  
  1474. //------------------------------------------------------------------------------
  1475. // ViewTypetoViewEnum
  1476. //------------------------------------------------------------------------------
  1477.  
  1478. static DescType ViewTypetoViewEnum( Environment *ev, ODSession* session,
  1479.         ODTypeToken viewType )
  1480. {
  1481.     if ( viewType == session->Tokenize(ev, kODViewAsSmallIcon) )
  1482.         return kAEODSmallIcon;
  1483.     else if ( viewType == session->Tokenize(ev, kODViewAsLargeIcon) )
  1484.         return kAEODLargeIcon;
  1485.     else if ( viewType == session->Tokenize(ev, kODViewAsFrame) )
  1486.         return kAEODFrame;
  1487.     else if ( viewType == session->Tokenize(ev, kODViewAsThumbnail) )
  1488.         return kAEODThumbnail;
  1489.     else
  1490.     {
  1491.         WARN( "ViewTypetoViewEnum found unknown viewType" );
  1492.         return typeNull;
  1493.     }
  1494. }
  1495.  
  1496. //------------------------------------------------------------------------------
  1497. // GetViewTypeFromEnum
  1498. //------------------------------------------------------------------------------
  1499.  
  1500. static ODTypeToken GetViewTypeFromEnum( Environment *ev, ODSession* session,
  1501.         DescType viewEnum )
  1502. {
  1503.     switch( viewEnum )
  1504.     {
  1505.         case kAEODSmallIcon:
  1506.             return session->Tokenize(ev, kODViewAsSmallIcon);
  1507.         case kAEODLargeIcon:
  1508.             return session->Tokenize(ev, kODViewAsLargeIcon);
  1509.         case kAEODFrame:
  1510.             return session->Tokenize(ev, kODViewAsFrame);
  1511.         case kAEODThumbnail:
  1512.             return session->Tokenize(ev, kODViewAsThumbnail);
  1513.         default:
  1514.             WARN( "GetViewTypeFromEnum: unknown view type enum" );
  1515.             return -1;
  1516.     }    
  1517. }
  1518.  
  1519. //------------------------------------------------------------------------------
  1520. // GetDirectParam
  1521. //
  1522. //    WE NEED TO CONSOLIDATE THIS WITH GetDirectParam IN RlShlEv.cpp!
  1523. //------------------------------------------------------------------------------
  1524.  
  1525. static void GetDirectParam(ODSession* session, ODAppleEvent* message,
  1526.         AEDesc* evtDp)
  1527. {
  1528.     Environment* ev = somGetGlobalEnvironment();
  1529.     AppleEvent localAEVT;
  1530.     THROW_IF_ERROR( ODDescToAEDesc( message, &localAEVT ) );
  1531.  
  1532.     AEDesc localDP;
  1533.     THROW_IF_ERROR( AEGetParamDesc( &localAEVT, keyDirectObject,
  1534.             typeWildCard, &localDP ) );
  1535.     ODOSLToken* oddesc = new ODOSLToken();
  1536.     THROW_IF_NULL(oddesc);
  1537.     oddesc->InitODOSLToken(ev);
  1538.     THROW_IF_ERROR( AEDescToODDesc( &localDP, oddesc ) );
  1539.  
  1540.     ODNameResolver* resolver = session->GetNameResolver(ev);
  1541.     ODBoolean isToken = resolver->IsODToken(ev, oddesc);
  1542.     ODDeleteObject(oddesc);
  1543.     if ( isToken )
  1544.     {
  1545.         *evtDp = localDP;
  1546.     }
  1547.     else
  1548.     {
  1549.         (void)AEDisposeDesc( &localDP );
  1550.         WARN("GetDirectParam. Found a non-token.  About to throw.");
  1551.         THROW( errAEEventNotHandled );
  1552.     }
  1553.     
  1554.     ODDisposeAppleEvent(&localAEVT);
  1555. }    // GetDirectParam()
  1556.  
  1557. //------------------------------------------------------------------------------
  1558. // DescToODOSLToken
  1559. //------------------------------------------------------------------------------
  1560.  
  1561. static ODOSLToken* DescToODOSLToken( Environment* ev, ODNameResolver* resolver,
  1562.         AEDesc* frameDesc, ODOSLToken* tokenToCopy )
  1563. {
  1564.     ODOSLToken* newToken = tokenToCopy->DuplicateODOSLToken(ev);
  1565.     ODDesc* userODToken = resolver->GetUserToken( ev, newToken );
  1566.     AEDescToODDesc(frameDesc, userODToken);
  1567.  
  1568.     return newToken;
  1569. }
  1570.  
  1571. //------------------------------------------------------------------------------
  1572. // AddODOSLTokenToList
  1573. //
  1574. //    Add newToken into list that's in value.
  1575. //------------------------------------------------------------------------------
  1576.  
  1577. static void AddODOSLTokenToList( ODOSLToken* newToken, ODUShort index,
  1578.         AEDesc* list )
  1579. {
  1580.     AEDesc singleTokenAsAEDesc;
  1581.     THROW_IF_ERROR( ODDescToAEDesc( newToken, &singleTokenAsAEDesc ) );
  1582.     
  1583.     WASSERT( list->descriptorType == typeAEList );
  1584.  
  1585.     THROW_IF_ERROR( AEPutDesc( list, index, &singleTokenAsAEDesc) );
  1586.     (void)AEDisposeDesc( &singleTokenAsAEDesc );
  1587. }
  1588.  
  1589.  
  1590. //------------------------------------------------------------------------------
  1591. // PutFrameInValue
  1592. //------------------------------------------------------------------------------
  1593.  
  1594. static void PutFrameInValue( Environment* ev, ODNameResolver* resolver,
  1595.         ODOSLToken* value, ODFrame* frame )
  1596. {
  1597.     AEDesc    myToken;
  1598.  
  1599.     if ( !frame )
  1600.         THROW(errAENoSuchObject);
  1601.     TempODPart part = frame->AcquirePart(ev);
  1602.     CreateStandardPartToken( frame, part, &myToken );
  1603.     ODDesc* userODToken = resolver->GetUserToken(ev, value);
  1604.     THROW_IF_ERROR( AEDescToODDesc( &myToken, userODToken ));
  1605.     AEDisposeDesc(&myToken);
  1606. }
  1607.  
  1608. //------------------------------------------------------------------------------
  1609. // ITextEqual
  1610. //------------------------------------------------------------------------------
  1611.  
  1612. static ODBoolean ITextEqual( ODIText* name1, ODIText* name2 )
  1613. {
  1614.     return ( (GetITextLangCode(name1) == GetITextLangCode(name2))
  1615.         && (GetITextScriptCode(name1) == GetITextScriptCode(name2))
  1616.         && (GetITextStringLength(name1) == GetITextStringLength(name2))
  1617.         && (strcmp( GetITextString(name1, (char*)kODNULL),
  1618.                 GetITextString(name2, (char*)kODNULL))==0) ) ;
  1619. }
  1620.  
  1621. //------------------------------------------------------------------------------
  1622. // AcquireFrameWithName
  1623. //------------------------------------------------------------------------------
  1624. static ODFrame* AcquireFrameWithName( Environment* ev, ODFrame* startFrame,
  1625.         ODIText* name )
  1626. {
  1627.     // beginning with this part, or with root part if this part is null,
  1628.     // do a recursive search until we find a part whose name is the same
  1629.     // as that given by name.  It's important to always begin the search
  1630.     // with this part, as we shouldn't find a part with the target name if
  1631.     // it isn't inside our container.
  1632.  
  1633.     ODBoolean                    foundNonEmbeddingFrame = kODFalse;
  1634.     ODEmbeddedFramesIterator*    iter;
  1635.  
  1636.     ODVolatile(foundNonEmbeddingFrame);
  1637.  
  1638.     WASSERT( startFrame );
  1639.  
  1640.     TempODPart savePart = startFrame->AcquirePart(ev);
  1641.     TRY
  1642.         iter = savePart->CreateEmbeddedFramesIterator(ev, kODNULL);
  1643.         if (iter == kODNULL)
  1644.             foundNonEmbeddingFrame = kODTrue;
  1645.     CATCH_ALL
  1646.         foundNonEmbeddingFrame = kODTrue;
  1647.     ENDTRY
  1648.  
  1649.     ODFrame* result = kODNULL;
  1650.     
  1651.     if (!foundNonEmbeddingFrame)
  1652.     {
  1653.         ODFrame* frame;
  1654.         for ( frame = iter->First(ev); iter->IsNotComplete(ev);
  1655.                                 frame = iter->Next(ev) )
  1656.         {
  1657.             TempODIText canName = ODGetPartName(ev, frame, kODNULL );
  1658.             if ( ITextEqual( canName, name ) )
  1659.             {
  1660.                 frame->Acquire(ev);
  1661.                 result = frame;
  1662.                 break;
  1663.             }
  1664.             else if ( (result = AcquireFrameWithName( ev, frame, name )) != kODNULL )
  1665.                 break;
  1666.         }
  1667.         ODDeleteObject(iter);
  1668.     }
  1669.  
  1670.     return result;
  1671. }
  1672.  
  1673. //------------------------------------------------------------------------------
  1674. // CreateObjSpecForFrame
  1675. //------------------------------------------------------------------------------
  1676.  
  1677. static OSErr CreateObjSpecForFrame( Environment *ev, ODFrame* frame,
  1678.         AEDesc* result )
  1679. {
  1680.     ODPersistentObjectID id = GetIDForFrame( ev, frame );
  1681.     AEDesc nullDesc = NULL_DESCRIPTOR_DEFINITION;
  1682.     AEDesc dataDesc;
  1683.     THROW_IF_ERROR( AECreateDesc( typeLongInteger, &id, sizeof(id),
  1684.             &dataDesc ) );
  1685.     return CreateObjSpecifier( cPart, &nullDesc, pUniqueID,
  1686.             &dataDesc, true, result );
  1687. }
  1688.  
  1689. //------------------------------------------------------------------------------
  1690. // GetIDForFrame
  1691. //------------------------------------------------------------------------------
  1692.  
  1693. static ODPersistentObjectID GetIDForFrame( Environment* ev, ODFrame* frame )
  1694. {
  1695.     ODStorageUnit* su = frame->GetStorageUnit(ev);
  1696.     WASSERT(su);
  1697.     ODDraft* draft = su->GetDraft(ev);
  1698.     WASSERT(draft);
  1699.     return draft->GetPersistentObjectID( ev,
  1700.             (ODPersistentObject*)frame, kODFrameObject);
  1701. }
  1702.  
  1703. //------------------------------------------------------------------------------
  1704. // CopyNonDPParams
  1705. // Move from one AppleEvent to another all parameters but the direct parameter.
  1706. // <eeh> should modify to move attributes as well, probably by changing the
  1707. // type of the AppleEvent from 'aevt' to 'meta' temporarily.  This function
  1708. // could then also be used in ODMessageInterface::DispatchToEventHandlerAux
  1709. // where it copies data back into the reply it must return.
  1710. //------------------------------------------------------------------------------
  1711.  
  1712. #ifdef TO_BE_DELETED
  1713. static void CopyNonDPParams( ODAppleEvent* message, ODAppleEvent* newMessage )
  1714. {
  1715.     AppleEvent sourceAEVT;
  1716.     AppleEvent destAEVT;
  1717.     THROW_IF_ERROR( ODDescToAEDesc( message, &sourceAEVT ) );
  1718.     THROW_IF_ERROR( ODDescToAEDesc( newMessage, &destAEVT ) );
  1719.  
  1720.     long numParams;
  1721.     THROW_IF_ERROR( AECountItems( &sourceAEVT, &numParams ) );
  1722.     for ( long index = 1; index <= numParams; ++index )
  1723.     {
  1724.         AEDesc oneParam;
  1725.         DescType keyword;
  1726.         THROW_IF_ERROR( AEGetNthDesc( &sourceAEVT, index, typeWildCard,
  1727.                 &keyword, &oneParam ) );
  1728.         if ( keyword != keyDirectObject )
  1729.             THROW_IF_ERROR( AEPutParamDesc( &destAEVT, keyword, &oneParam ) );
  1730.         AEDisposeDesc( &oneParam );
  1731.     }
  1732.     THROW_IF_ERROR( AEDescToODDesc( &destAEVT, newMessage ) );
  1733.     ODDisposeAppleEvent( &sourceAEVT );
  1734.     ODDisposeAppleEvent( &destAEVT );
  1735. }
  1736. #endif /* TO_BE_DELETED */
  1737.  
  1738. //------------------------------------------------------------------------------
  1739. // PartIsContained
  1740. //------------------------------------------------------------------------------
  1741.  
  1742. ODBoolean PartIsContained( Environment* ev, ODFrame* testee,
  1743.     ODFrame* container )
  1744. {
  1745.     ODBoolean result ;
  1746.     if ( !testee )
  1747.          result = kODFalse;
  1748.     else if ( !container )
  1749.         result = kODTrue;        // root frame contains all
  1750.  
  1751.     // before the first AcquireContainingFrame call don't test for equality,
  1752.     // as a frame can't contain itself.
  1753.     else
  1754.     {
  1755.         while ( !result &&
  1756.                 ((testee = testee->AcquireContainingFrame(ev)) != kODNULL) )
  1757.         {
  1758.             result = ODObjectsAreEqual( ev, testee, container );
  1759.             ODFrame* saveCopy = testee;
  1760.             ODReleaseObject( ev, saveCopy );
  1761.         }
  1762.     }
  1763.     return result;
  1764. }
  1765.  
  1766. //------------------------------------------------------------------------------
  1767. // IndexForFrame
  1768. //------------------------------------------------------------------------------
  1769.  
  1770. static OSErr IndexForFrame( Environment *ev, ODFrame* frame, ODULong* result )
  1771. {
  1772.     TempODFrame parentFrame = frame->AcquireContainingFrame(ev);
  1773.     ODULong tempResult = 0;
  1774.     if ( parentFrame != kODNULL )
  1775.     {
  1776.         TempODPart part = parentFrame->AcquirePart(ev);
  1777.         ODEmbeddedFramesIterator* iter =
  1778.                 part->CreateEmbeddedFramesIterator( ev, kODNULL );
  1779.         if (iter == kODNULL)
  1780.             THROW(kODErrCannotEmbed);
  1781.         ODFrame* testFrame;
  1782.         for ( testFrame = iter->First(ev), tempResult = 1;
  1783.                 !ODObjectsAreEqual(ev, frame, testFrame)
  1784.                         && iter->IsNotComplete(ev);
  1785.                 ++tempResult, testFrame = iter->Next(ev) )
  1786.         {
  1787.         }
  1788.         ODDeleteObject(iter);
  1789.     }
  1790.     else
  1791.     {
  1792.         return errAENoSuchObject;
  1793.     }
  1794.     *result = tempResult;
  1795.     return noErr;
  1796. }
  1797.  
  1798. //------------------------------------------------------------------------------
  1799. // SwapToRootPart
  1800. //------------------------------------------------------------------------------
  1801.  
  1802. static ODError SwapToRootPart( Environment *ev, ODSession* session,
  1803.         ODOSLToken* value)
  1804. {
  1805.     ODFrame* frame = GetDefaultRootFrame(ev, session);
  1806.     if ( !frame )
  1807.         return errAENoSuchObject;
  1808.     else
  1809.     {
  1810.         // when will this part be released???
  1811.         TempODPart savePart = frame->AcquirePart(ev);
  1812.         session->GetNameResolver(ev)->
  1813.                 CreateSwapToken( ev, value, savePart, frame );
  1814. //        ODReleaseObject( ev, savePart );
  1815.     }
  1816.     return noErr;
  1817. }
  1818.  
  1819. //------------------------------------------------------------------------------
  1820. // ODDuplicateEvent
  1821. //------------------------------------------------------------------------------
  1822.  
  1823. void ODDuplicateEvent( ODAppleEvent* scrDesc,
  1824.         ODAppleEvent** destDesc )
  1825. {
  1826.     Environment*    ev = somGetGlobalEnvironment();
  1827.     AppleEvent newAevt;
  1828.     OSErr err = ODDescToAEDesc( scrDesc, &newAevt );
  1829.     if ( err == noErr )
  1830.     {
  1831.         ODAppleEvent* tmp = new ODAppleEvent();
  1832.         THROW_IF_NULL(tmp);
  1833.         tmp->InitODAppleEvent(ev);
  1834.         err = AEDescToODDesc( &newAevt, tmp );
  1835.         ODDisposeAppleEvent(&newAevt);
  1836.         *destDesc = tmp;
  1837.     }
  1838.     THROW_IF_ERROR(err);
  1839. }
  1840.  
  1841. //------------------------------------------------------------------------------
  1842. // ODPutParamDesc
  1843. //------------------------------------------------------------------------------
  1844.  
  1845. void ODPutParamDesc( ODAppleEvent* odaevt, DescType keyword, AEDesc* desc )
  1846. {
  1847.     AppleEvent local;
  1848.     OSErr err = ODDescToAEDesc( odaevt, &local );
  1849.     if ( err == noErr )
  1850.     {
  1851.         err = AEPutParamDesc( &local, keyword, desc );
  1852.         if ( err == noErr )
  1853.             err = AEDescToODDesc( &local, odaevt );
  1854.         ODDisposeAppleEvent(&local);
  1855.     }
  1856.     THROW_IF_ERROR(err);
  1857. }
  1858.  
  1859. //------------------------------------------------------------------------------
  1860. // ODPutParamDesc
  1861. //------------------------------------------------------------------------------
  1862.  
  1863. void ODPutParamDesc( ODAppleEvent* odaevt, DescType keyword, ODDesc* desc )
  1864. {
  1865.     AEDesc localDesc;
  1866.     THROW_IF_ERROR( ODDescToAEDesc( desc, &localDesc ) );
  1867.     TempAEDesc tmpDesc(&localDesc);
  1868.     ODPutParamDesc( odaevt, keyword, &localDesc );
  1869. }
  1870.  
  1871. //------------------------------------------------------------------------------
  1872. // ODGetParamDesc
  1873. //------------------------------------------------------------------------------
  1874.  
  1875. void ODGetParamDesc( ODAppleEvent* odaevt, DescType keyword, DescType typeSought,
  1876.         AEDesc* desc )
  1877. {
  1878.     AppleEvent event;
  1879.     OSErr err = ODDescToAEDesc( odaevt, &event );
  1880.     if ( err == noErr )
  1881.     {
  1882.         err = AEGetParamDesc( &event, keyword, typeSought, desc );
  1883.         ODDisposeAppleEvent(&event);
  1884.     }
  1885.     THROW_IF_ERROR(err);
  1886. }
  1887.  
  1888. //------------------------------------------------------------------------------
  1889. // ODGetParamDesc
  1890. //------------------------------------------------------------------------------
  1891.  
  1892. void ODGetParamDesc( ODAppleEvent* odaevt, DescType keyword,
  1893.         DescType typeSought, ODDesc** desc )
  1894. {
  1895.     Environment*    ev = somGetGlobalEnvironment();
  1896.     AEDesc            resultAsAEDesc;
  1897.  
  1898.     ODDesc* result = new ODDesc();
  1899.     THROW_IF_NULL(result);
  1900.     result->InitODDesc( ev );
  1901.  
  1902.     ODGetParamDesc( odaevt, keyword, typeSought, &resultAsAEDesc );
  1903.     OSErr error = AEDescToODDesc( &resultAsAEDesc, result);
  1904.     THROW_IF_ERROR (error);
  1905.     AEDisposeDesc(&resultAsAEDesc);
  1906.     *desc = result;
  1907. }
  1908.  
  1909. //------------------------------------------------------------------------------
  1910. // ODPutAttributeDesc
  1911. //------------------------------------------------------------------------------
  1912.  
  1913. void ODPutAttributeDesc( ODAppleEvent* message, AEKeyword key, ODDesc* desc )
  1914. {
  1915.     AppleEvent messageAsAEDesc;
  1916.     THROW_IF_ERROR( ODDescToAEDesc( message, &messageAsAEDesc ) );
  1917.     AEDesc attrDescAsAEDesc;
  1918.     THROW_IF_ERROR( ODDescToAEDesc( desc, &attrDescAsAEDesc ) );
  1919.     THROW_IF_ERROR( AEPutAttributeDesc( &messageAsAEDesc, key,
  1920.                                         &attrDescAsAEDesc) );
  1921.     AEDisposeDesc(&attrDescAsAEDesc);
  1922.     THROW_IF_ERROR( AEDescToODDesc(&messageAsAEDesc, message ));
  1923.     ODDisposeAppleEvent(&messageAsAEDesc);
  1924. }
  1925.  
  1926. //------------------------------------------------------------------------------
  1927. // ODGetAttributePtr
  1928. //------------------------------------------------------------------------------
  1929.  
  1930. void ODGetAttributePtr( ODAppleEvent *appleEvent, AEKeyword theAEKeyword,
  1931.         DescType desiredType, DescType *typeCode, void *dataPtr,
  1932.         Size maximumSize, Size *actualSize)
  1933. {
  1934.     AppleEvent event;
  1935.     OSErr err = ODDescToAEDesc( appleEvent, &event );
  1936.     if ( err == noErr )
  1937.     {
  1938.         err = AEGetAttributePtr( &event, theAEKeyword, desiredType,
  1939.                 typeCode, dataPtr, maximumSize, actualSize );
  1940.         (void)ODDisposeAppleEvent( &event );
  1941.     }
  1942.     THROW_IF_ERROR( err );
  1943. }
  1944.  
  1945. #if ODDebug
  1946. void ASSERT_FRAME_MATCHES_PART( Environment *ev, ODFrame* frame, ODPart* part )
  1947. {
  1948. #if 0
  1949.     if ( frame )
  1950.     {
  1951.         TempODPart savePart = frame->AcquirePart(ev);
  1952.         ODBoolean partMatchesFrame = ODObjectsAreEqual(ev, savePart, part);
  1953. //        ODBoolean partMatchesFrame = savePart == part;
  1954. //        ODReleaseObject( ev, savePart );
  1955.         WASSERT( partMatchesFrame );
  1956.     }
  1957. #endif
  1958. }
  1959. #endif
  1960.  
  1961.